package org.dxy.domain.model.aggregate;

import org.dxy.domain.command.workstation.*;
import org.dxy.domain.event.workstation.*;
import org.dxy.domain.model.aggregate.impl.WorkstationAggRoot;
import org.dxy.domain.model.valobj.WorkstationId;

import java.util.List;

/**
 * @description: 工位聚合根接口
 * @author: dxy 
 * @createTime: 2025/6/22 17:26 
 */
public interface Workstation  extends AggregateRoot {
    // 领域属性
    WorkstationId getWorkstationId();



    // === 静态工厂方法 ===

    /**
     * 创建工位
     * @param command 创建工位命令
     * @param workstationId 工位ID
     * @return 工位聚合根
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    static Workstation create(CreateWorkstationCommand command, Long workstationId) {
        return WorkstationAggRoot.create(command, workstationId);
    }


    /**
     * 工位进站
     */
    void stationIn(WorkstationInCommand command);

    /**
     * 工位出站
     */
    void stationOut(WorkstationOutCommand command);

    // === 业务方法 ===

    /**
     * 暂停工位
     * @param reason 暂停原因
     * @param currentOperator 当前操作员
     * @return 工位暂停事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationPausedEvent pause(String reason, String currentOperator);

    /**
     * 恢复工位
     * @param command 恢复工位命令
     * @return 工位恢复事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationResumedEvent resume(ResumeWorkstationCommand command);

    /**
     * 上报工位错误
     * @param command 上报错误命令
     * @return 工位错误发生事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationErrorOccurredEvent reportError(ReportWorkstationErrorCommand command);

    /**
     * 重置工位
     * @param command 重置工位命令
     * @return 工位重置事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationResetEvent reset(ResetWorkstationCommand command);

    /**
     * 分配设备到工位
     * @param command 分配设备命令
     * @return 工位设备分配事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationAssignedDevicesEvent assignDevices(AssignDevicesToWorkstationCommand command);

    /**
     * 停止工位
     * @param command 停止工位命令
     * @return 工位停止事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationStoppedEvent stop(StopWorkstationCommand command);

    /**
     * 移除工位
     * @param command 移除工位命令
     * @return 工位移除事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationRemovedEvent remove(RemoveWorkstationCommand command);

    /**
     * 追加设备到工位
     * @param command 追加设备命令
     * @return 工位设备追加事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationDevicesAppendedEvent appendDevices(AppendDevicesToWorkstationCommand command);

    /**
     * 从工位移除设备
     * @param deviceIds 设备ID列表
     * @param operator 操作员
     * @return 工位设备移除事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationDevicesRemovedEvent removeDevices(List<Long> deviceIds, String operator);

    /**
     * 释放工位所有设备
     * @param operator 操作员
     * @return 工位设备释放事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationDevicesReleasedEvent releaseAllDevices(String operator);

}

